home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 2 / AACD 2.iso / SearchCDs < prev    next >
Text File  |  1999-09-30  |  17KB  |  496 lines

  1. /*
  2. SearchCDs - Searches index files of Amiga Active CDs,
  3.             Aminet CDs and Aminet Online files
  4. $VER: SearchCDs 1.3 (16.8.99) (c) Neil Bothwick, Wirenet
  5. */
  6.  
  7. /* ;;; Initialise */
  8. options results
  9. signal on error
  10. CurrStack = pragma('S',16384)
  11. if CurrStack > 16384 then call pragma('S',CurrStack)
  12.  
  13. VerStr     = sourceline(4)
  14. VerStr     = subword(VerStr,2,words(VerStr) - 4)
  15. Title      = 'SearchCDs'
  16. GuiPort    = upper(Title)
  17. PrgPort    = GuiPort'-PRG'
  18. WinTitle   = 'Amiga Active CD Search'
  19. WinTitle   = 'Amiga Active CD preferences'
  20. qt         = '22'x
  21. CurrentDir = pragma('D')
  22. parse var CurrentDir CDname ':' .
  23. if left(CDName,4) ~= 'AACD' then CDname = 'AACD02'
  24. select
  25.     when right(CurrentDir,6) = 'Aminet' then DefSearch = 'Aminet Online'
  26.     when right(CurrentDir,3) = 'CDs' then DefSearch = 'Aminet CDs'
  27.     when right(CurrentDir,4) = 'Sets' then DefSearch = 'Aminet Sets'
  28.     otherwise DefSearch = 'Amiga Active CDs'
  29.     end
  30. ;;;
  31. /* ;;; Set index variables and ensure all necessary files are available */
  32. address command
  33. if ~exists('C:FlashFind') then 'copy 'CDname':C/FlashFind C: clone quiet'
  34. if exists('ENVARC:AACD/AACDIndex') then AACDPath = AddPart(GetVar('AACD/AACDIndex'),'')
  35. else AACDPath = CDname':CDTools/indices/'
  36. if exists('ENVARC:AACD/AminetCDIndex') then AminetCDPath = AddPart(GetVar('AACD/AminetCDIndex'),'')
  37. else AminetCDPath = CDname':AACD/CDROM/AminetCDs/CDs'
  38. if exists('ENVARC:AACD/AminetSetIndex') then AminetSetPath = AddPart(GetVar('AACD/AminetSetIndex'),'')
  39. else AminetSetPath = CDname':AACD/CDROM/AminetCDs/Sets/'
  40. if exists('ENVARC:AACD/AminetIndex') then AminetPath = AddPart(GetVar('AACD/AminetIndex'),'')
  41. else AminetPath = CDname':AACD/Online/Aminet/'
  42. OutFile = 'T:SearchCDs.results'
  43. ;;;
  44. /* ;;; Define MUI variables */
  45. MUIA_List_Quiet                   = 0x8042d8c7
  46. MUIM_List_Select                  = 0x804252d8
  47. MUIV_List_Select_All              = -2
  48. MUIV_List_Select_On               = 1
  49. MUIV_List_Select_Ask              = 3
  50. MUIA_List_First                   = 0x804238d4
  51. MUIM_List_Remove                  = 0x8042647e
  52. MUIV_List_Remove_Selected         = -3
  53. MUIA_List_Entries                 = 0x80421654
  54. MUIA_List_Quiet                   = 0x8042d8c7
  55. MUIA_Listview_MultiSelect         = 0x80427e08
  56. MUIV_Listview_MultiSelect_Default = 1
  57. MUIA_Gauge_Current                = 0x8042f0dd
  58. MUIA_Gauge_Divide                 = 0x8042d8df
  59. MUIA_Gauge_Horiz                  = 0x804232dd
  60. MUIA_Gauge_InfoText               = 0x8042bf15
  61. MUIA_Gauge_Max                    = 0x8042bcdb
  62. MUIA_Group_Columns                = 0x8042f416
  63. MUIA_Menuitem_Shortcut            = 0x80422030
  64. MUIA_Application_Active           = 0x804260ab
  65. MUIA_Application_Author           = 0x80424842
  66. MUIA_Application_Copyright        = 0x8042ef4d
  67. MUIA_Application_Description      = 0x80421fc6
  68. MUIA_Application_HelpFile         = 0x804293f4
  69. MUIA_Application_Iconified        = 0x8042a07f
  70. MUIA_Application_Title            = 0x804281b8
  71. MUIA_Application_Version          = 0x8042b33f
  72. MUIA_Application_Sleep            = 0x80425711
  73. MUIM_Application_AboutMUI         = 0x8042d21d
  74. TRUE = 1
  75. FALSE = 0
  76. ;;;
  77. /* ;;; Load libraries */
  78. call LoadLib('rexxsupport.library')
  79. call LoadLib('rexxdossupport.library')
  80. call LoadLib('rexxreqtools.library')
  81. ;;;
  82. /* ;;; Open arexx port and GUI */
  83. thisport = openport(PrgPort)
  84. if thisport = 0 then exit
  85. address(GuiPort)
  86. window id MAIN port PrgPort command 'QUIT' title '"'WinTitle'"'
  87.     group id ALL
  88.         group horiz attrs MUIA_Group_Columns 2
  89.             label double 'Search string'
  90.             string id SCSTR help '"Enter a string to search for"' /*content 'test'*/
  91.             label double 'CDs to search'
  92.             cycle id CDTYP port PrgPort command 'RESCAN' help '"Which types of CD do\nyou wish to search?"' labels 'Amiga Active CDs,Aminet CDs,Aminet Sets,Aminet Online'
  93.             label double 'Output format'
  94.             cycle id OPFMT help '"Choose the output format"' labels 'HTML,Text'
  95.             endgroup
  96.  
  97.         list id CDLST attrs MUIA_Listview_MultiSelect MUIV_Listview_MultiSelect_Default help '"Select the CDs to search"'
  98.         group id BTNS horiz
  99.             button id GO  port PrgPort command 'SEARCH' help '"Start the search"' label 'Search'
  100.             button id ALL port PrgPort command 'ALL' help '"Select all CDs in the list"' label 'Select All'
  101.             button id ESC port PrgPort command 'QUIT' '"Exit without searching"' label 'Cancel'
  102.             endgroup
  103.         gauge id PROGR attrs MUIA_Gauge_Horiz MUIA_Gauge_InfoText '' help '"Shows the progress of the search"' label ''
  104.         endgroup
  105.     menu id PROJM label 'Project'
  106.         item id ABOUT port PrgPort command 'ABOUT' MUIA_Menuitem_Shortcut '?' label 'About'
  107.         item id MUI   port PrgPort command 'ABOUTMUI' label 'About MUI...'
  108.         item id QUITM port PrgPort command 'QUIT'  MUIA_Menuitem_Shortcut 'Q' label 'Quit'
  109.         endmenu
  110.     endwindow
  111.  
  112. cycle id CDTYP label DefSearch
  113. call LoadList()
  114. 'application' MUIA_Application_Version '$VER: SearchCD 1.2 (15.4.99)'
  115. 'application' MUIA_Application_Author 'Neil Bothwick'
  116. 'application' MUIA_Application_Copyright '© 1998 by Neil Bothwick, Wirenet'
  117. 'application' MUIA_Application_Title 'SearchCD'
  118. 'application' MUIA_Application_Description 'Search AACD, and Aminet index files'
  119. /*'application' MUIA_Application_Description 'Search AACD and Aminet index files'*/
  120. ;;;
  121. /* ;;; Main loop */
  122. do forever
  123.     call waitpkt(PrgPort)
  124.     packet = getpkt(PrgPort)
  125.     if packet = '0000 0000'x then iterate
  126.     cmd = getarg(packet)
  127.     call reply(packet,0)
  128.     select
  129.     ;;;
  130. ;;;     /* Search */
  131.         when cmd = 'SEARCH' then do
  132.             'list id CDLST attrs' MUIA_List_Quiet TRUE
  133.             'application' MUIA_Application_Sleep TRUE
  134.             /* Get search string */
  135.             'string id SCSTR'
  136.             SearchStr = result
  137.             /* Get list of CDs to search */
  138.             drop CDs.
  139.             i = 0
  140.             do forever
  141.                  list id CDLST
  142.                  if result = '' then break
  143.                  i = i + 1
  144.                  CDs.i = result
  145.                  end
  146.             CDs.0 = i
  147.             select
  148.                 when SearchStr = '' then call ShowMsg('You must specify a string to search for')
  149.                 when CDs.0 = 0 then call ShowMsg('You must select at least one index to search')
  150.                 otherwise call Search()
  151.                 end
  152.             'application' MUIA_Application_Sleep FALSE
  153.             'list id CDLST attrs' MUIA_List_Quiet FALSE
  154.             end
  155. ;;;
  156. ;;;     /* Select All */
  157.         when cmd = 'ALL' then do
  158.             'method id CDLST' MUIM_List_Select MUIV_List_Select_All MUIV_List_Select_On
  159.             end
  160. ;;;
  161. ;;;     /* Rescan */
  162.         when cmd = 'RESCAN' then call LoadList()
  163. ;;;
  164. ;;;     /* About */
  165.         when cmd = 'ABOUT' then call ShowMsg(VerStr||'0a'x||'Programmed using MUIrexx')
  166.         when cmd = 'ABOUTMUI' then 'method ' MUIM_Application_AboutMUI 0
  167. ;;;
  168. ;;;     /* Cancel */
  169.         otherwise call CleanUp()
  170.         end
  171.     end
  172. ;;;
  173. /* ;;; Subroutines */
  174. ;;;
  175. /* ;;; Load a library */
  176. LoadLib:
  177.     parse arg library
  178.     if show('L',library) then return
  179.     if ~exists('LIBS:'library) then address command 'copy 'CDname':libs/'library 'LIBS: clone quiet'
  180.     if ~addlib(library,0,-30,0) then call ExitMsg('Failed to load' library||'0a'x||'Make sure you have run InitCD')
  181.     return
  182. ;;;
  183. /* ;;; Show a message in a requester */
  184. ShowMsg:
  185.     parse arg msg
  186.     oldaddr = address()
  187.     address(GuiPort)
  188.     'request id MAIN title "'WinTitle'" gadgets "OK" string' msg
  189.     choice = result
  190.     address(oldaddr)
  191.     return choice
  192. ;;;
  193. /* ;;; Exit with a requester */
  194. ExitMsg:
  195.     parse arg msg
  196.     call ShowMsg(msg)
  197.     call Cleanup()
  198.     return
  199. ;;;
  200. /* ;;; Cleanup and exit */
  201. CleanUp:
  202.     call delete(OutFile'#?')
  203.     address(GuiPort)
  204.     'QUIT'
  205.     exit
  206. ;;;
  207. /* ;;; Search CDs */
  208. Search:
  209. 'cycle id OPFMT'
  210. Format = result
  211.     call delete(OutFile)
  212.     'gauge id PROGR attrs' MUIA_Gauge_Max CDs.0 MUIA_Gauge_InfoText '%ld/'CDs.0
  213.     do i = 1 to CDs.0
  214.         'gauge id PROGR attrs' MUIA_Gauge_Current i
  215.         select
  216.             when Source = 'Aminet CDs' then address command 'echo "*NAMINET'right(CDs.i,2)':" >>'OutFile
  217.             /*when Source = 'Aminet Sets' then address command 'echo "*NAminetSet'right(CDs.i,1)':" >>'OutFile*/
  218.             when Format = 'Text' then NH = ''
  219.             otherwise NH = 'NH'
  220.             end
  221.         signal off error
  222.         address command 'FlashFind >>'OutFile AddPart(IndexPath,CDs.i) '"'SearchStr'" NOPREFS QUIET' NH
  223.         signal on error
  224.         end
  225. ;;;
  226. /* ;;; Show matches or warn if none */
  227. if word(statef(OutFile),2) = 0 then do
  228.     call ShowMsg('No matches found for "'SearchStr'"')
  229.     return
  230.     end
  231. if ~open(res,OutFile,'R') then do
  232.     call ShowMsg('File open failure')
  233.     return
  234.     end
  235. if ~open(out,OutFile'1','W') then do
  236.     call ShowMsg('File open failure')
  237.     return
  238.     end
  239.  
  240. select
  241. ;;;
  242.     /* ;;; Show Text */
  243.     when Format = 'Text' then do
  244.         if Source ='Aminet CDs' then do
  245.             /* Format output */
  246.             'gauge id PROGR attrs' MUIA_Gauge_Max word(statef(OutFile),2) MUIA_Gauge_InfoText '"Processing search results"'
  247.             BytesDone = 0
  248.             call readln(res)
  249.             do until eof(res)
  250.                 CDTitle = readln(res)
  251.                 select
  252.                     when CDTitle = 'AMINET01:' then CDTitle = 'AMINET_0693:'
  253.                     when CDTitle = 'AMINET02:' then CDTitle = 'AMINET_0294:'
  254.                     when CDTitle = 'AMINET03:' then CDTitle = 'AMINET_0794:'
  255.                     when substr(CDTitle,7,1) = '0' then CDTitle = compress(CDTitle,'0')
  256.                     otherwise nop
  257.                     end
  258.                 line = readln(res)
  259.                 do while ~eof(res) & line ~= ''
  260.                     BytesDone = BytesDone + length(line) + 1
  261.                     if left(line,1) ~= '|' then do
  262.                         parse var line name =19 path =30 .
  263.                         name = strip(name)
  264.                         path = CDTitle'Aminet/'strip(path)'/'name
  265.                         line = left(name'                                    ',33)||path
  266.                         call writeln(out,line)
  267.                         'gauge id PROGR attrs' MUIA_Gauge_Current BytesDone
  268.                         end
  269.                     line = readln(res)
  270.                     end
  271.                 end
  272.             end
  273.         else do
  274.             call close(out)
  275.             call delete(OutFile'1')
  276.             call rename(OutFile,OutFile'1')
  277.             end
  278.  
  279.         call close(res)
  280.         call close(out)
  281.         address command 'Multiview' OutFile'1'
  282.         call delete(OutFile'1')
  283.         end
  284.     ;;;
  285.     /* ;;; Show HTML */
  286.     when Format = 'HTML' then do
  287.         /* Find AWeb's arexx port or start it if not running */
  288.         ports = show('P')
  289.         portpos = pos('AWEB.',ports)
  290.         if portpos > 0 then AWebPort = word(substr(ports,portpos),1)
  291.         else do
  292.             address command 'Run >NIL: 'CDName':AACD/WebSites/AWeb3/AWebDemo config Amigactive'
  293.             AWebPort = 'AWEB.1'
  294.             end
  295.  
  296.         /* Open output file and write headers */
  297.         call writeln(out,'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">')
  298.         call writeln(out,'<html><head><title>Search results</title></head><body bgcolor=white>')
  299.         call writeln(out,'<h3 align=center>Result of searching 'Source' for "<font color=red>'SearchStr'</font>"</h3>')
  300.         call writeln(out,'<table width="100%">')
  301.  
  302.         /* Process output into HTML */
  303.         'gauge id PROGR attrs' MUIA_Gauge_Max word(statef(OutFile),2) MUIA_Gauge_InfoText '"Processing search results"'
  304.         BytesDone = 0
  305.         select
  306.             when pos(Source,'Amiga Active CDs') > 0 then do
  307.                 /* Format output */
  308.                 do until eof(res)
  309.                     line = readln(res)
  310.                     BytesDone = BytesDone + length(line) + 1
  311.                     if line = '' then iterate
  312.                     parse var line name =34 path
  313.                     name = strip(name)
  314.                     line = '<tr><td>'name'<td><a href="x-aweb:rexx/'left(path,pos(':',path))'CDTools/S/ShowDir 'PathPart(path)'">'path'</a>'
  315.                     call writeln(out,line)
  316.                     'gauge id PROGR attrs' MUIA_Gauge_Current BytesDone
  317.                     end
  318.                 end
  319.             when Source = 'Aminet CDs' then do
  320.                 /* Format output */
  321.                 call readln(res)
  322.                 do until eof(res)
  323.                     CDTitle = readln(res)
  324.                     line = readln(res)
  325.                     select
  326.                         when CDTitle = 'AMINET01:' then do
  327.                             CDTitle = 'AMINET_0693:'
  328.                             parsecmd = "name='';size=line;desc=''"
  329.                             end
  330.                         when CDTitle = 'AMINET02:' then do
  331.                             CDTitle = 'AMINET_0294:'
  332.                             parsecmd = 'parse var line name =22 path =33 size =37 age =38 desc'
  333.                             end
  334.                         when CDTitle = 'AMINET03:' then do
  335.                             CDTitle = 'AMINET_0794:'
  336.                             parsecmd = 'parse var line name =22 path =33 size =37 age =38 desc'
  337.                             end
  338.                         when CDTitle = 'AMINET04:' then do
  339.                             CDTitle = 'AMINET4:'
  340.                             parsecmd = 'parse var line name =22 path =33 size =37 age =38 desc'
  341.                             end
  342.                         when substr(CDTitle,7,1) = '0' then do
  343.                             parsecmd = 'parse var line name =20 path =31 size =37 age =40 desc'
  344.                             CDTitle = compress(CDTitle,'0')
  345.                             end
  346.                         otherwise parsecmd = 'parse var line name =20 path =31 size =37 age =40 desc'
  347.                         end
  348.  
  349.                     do while ~eof(res) & line ~= ''
  350.                         BytesDone = BytesDone + length(line) + 1
  351.                         if left(line,1) ~= '|' then do
  352.                             /*parse var line name =19 path =30 size +5 age +5 desc*/
  353.                             interpret parsecmd
  354.                             name = strip(name)
  355.                             path = CDTitle'Aminet/'strip(path)'/'name
  356.                             readme = left(path,lastpos('.',path))'readme'
  357.                             line = '<tr valign=top><td><a href="x-aweb:rexx/'CDName':CDTools/S/Extract.awebrx 'path'">'name'<td align=right>'strip(size)'<td><a href="file://localhost/'readme'">'desc'</a>'
  358.                             call writeln(out,line)
  359.                             'gauge id PROGR attrs' MUIA_Gauge_Current BytesDone
  360.                             end
  361.                         line = readln(res)
  362.                         end
  363.                     end
  364.                 end
  365.             when Source = 'Aminet Sets' then do
  366.                 /* Format output */
  367.                 call readln(res)
  368.                 do until eof(res)
  369.                     line = readln(res)
  370.                     BytesDone = BytesDone + length(line) + 1
  371.                     if left(line,1) = '|' then iterate
  372.                     parse var line name =20 path +11 size +5 age +4 CD +2 x +1 desc
  373.                     name = strip(name)
  374.                     path = 'AminetSet'CD':Aminet/'strip(path)'/'name
  375.                     readme = left(path,lastpos('.',path))'readme'
  376.                     line = '<tr><td><a href="x-aweb:rexx/'CDName':CDTools/S/Extract.awebrx 'path'">'name'<td align=right>'strip(size)'<td><a href="file://localhost/'readme'">'desc'</a>'
  377.                     call writeln(out,line)
  378.                     'gauge id PROGR attrs' MUIA_Gauge_Current BytesDone
  379.                     end
  380.                 end
  381.             when Source = 'Aminet Online' then do
  382.                 /* Format output */
  383.                 call writeln(out,'<th>Name<th>Size<th>Age<th>Description')
  384.                 do until eof(res)
  385.                     line = readln(res)
  386.                     BytesDone = BytesDone + length(line) + 1
  387.                     if line = '' | left(line,1) = '|' then iterate
  388.                     parse var line name =20 path +11 size +5 age +3 x +1 desc
  389.                     name = strip(name)
  390.                     path = 'ftp://uk.aminet.net/pub/aminet/'strip(path)'/'name
  391.                     readme = left(path,lastpos('.',path))'readme'
  392.                     line = '<tr><td><a href="'path'">'name'<td align=right>'strip(size)'<td align=right>'strip(age)'<td><a href="'readme'">'desc'</a>'
  393.                     call writeln(out,line)
  394.                     'gauge id PROGR attrs' MUIA_Gauge_Current BytesDone
  395.                     end
  396.                 call writeln(out,'<tr><td align=center colspan=4><p><hr><p><h5>The age is given in weeks since the date of this index ('date('N',word(statef(AddPart(IndexPath,'INDEX')),5),'I')')</h5>')
  397.                 end
  398.             otherwise call ShowMsg('Not done this bit yet')
  399.             end
  400.         call writeln(out,'</table></body></html>')
  401.         call close(res)
  402.         call close(out)
  403.  
  404.         /* Load HTML */
  405.         address command 'waitforport' AWebPort
  406.         if RC > 0 then call ExitMsg('Unable to start AWeb')
  407.         /*call delete(OutFile)*/
  408.         call delete(OutFile'.html')
  409.         call rename(OutFile'1',OutFile'.html')
  410.         address(AWebPort)
  411.         'open file://localhost/'OutFile'.html reload'
  412.         'screentofront'
  413.         'window tofront'
  414.  
  415.         end
  416.     ;;;
  417.     /* ;;; Show amigaguide */
  418.     when Format = 'AmigaGuide' then do
  419.         call ShowMsg('Not done this bit yet')
  420.         end
  421.     otherwise do
  422.         call ShowMsg('Not done this bit yet')
  423.         call close(res)
  424.         call close(out)
  425.         return
  426.         end
  427.     end
  428. call close(res)
  429. call close(out)
  430.  
  431. address(GuiPort)
  432. 'gauge id PROGR attrs' MUIA_Gauge_Current 0 MUIA_Gauge_InfoText '""'
  433. return
  434. ;;;
  435. /* ;;; List CDs for searching */
  436. LoadList:
  437.     address(GuiPort)
  438.     'list id CDLST attrs' MUIA_List_Quiet TRUE
  439.     'application' MUIA_Application_Sleep TRUE
  440.     /* Clear list */
  441.     'method id CDLST' MUIM_List_Select MUIV_List_Select_All MUIV_List_Select_On
  442.     'method id CDLST' MUIM_List_Remove MUIV_List_Remove_Selected
  443.     /* Create index list */
  444.     'cycle id CDTYP'
  445.     Source = result
  446.     address command
  447.     call delete(OutFile)
  448.     call delete(OutFile'1')
  449.     select
  450.         when Source = 'Amiga Active CDs' then do
  451.             IndexPath = AACDPath
  452.             'list' IndexPath 'pat AACD?? lformat "%N" to' OutFile
  453.             end
  454.         when Source = 'Aminet CDs' then do
  455.             IndexPath = AminetCDPath
  456.             'list' IndexPath 'pat Index?? lformat "%N" to' OutFile
  457.             end
  458.         when Source = 'Aminet Sets' then do
  459.             IndexPath = AminetSetPath
  460.             'list' IndexPath 'pat Set? lformat "%N" to' OutFile
  461.             end
  462.         when Source = 'Aminet Online' then do
  463.             IndexPath = AminetPath
  464.             if ~open(dirs,AddPart(IndexPath,'dirlist'),'R') then 'echo >'OutFile'1 "Unable to open index list"'
  465.             else do until eof(dirs)
  466.                 'echo >>'OutFile'1 "'readln(dirs)'"'
  467.                 end
  468.             end
  469.         otherwise nop
  470.         end
  471.     if exists(OutFile) then 'sort' OutFile OutFile'1'
  472.  
  473.     /* Display list */
  474.     address(GuiPort)
  475.     if ~open(listfile,OutFile'1','R') then call ExitMsg('Error reading file')
  476.     do while ~eof(listfile)
  477.         line = readln(listfile)
  478.         if line > '' then 'list id CDLST insert string' line
  479.         end
  480.     call close(listfile)
  481.     'application' MUIA_Application_Sleep FALSE
  482.     'list id CDLST attrs' MUIA_List_Quiet FALSE
  483.     return
  484. ;;;
  485. /* ;;; Error handler */
  486. Error:
  487.     oldaddress = address()
  488.     address(GuiPort)
  489.     call ShowMsg('Error' RC 'in line' sigl)
  490.     address(oldaddress)
  491.     if RC = 5 then return
  492.     call Cleanup()
  493.     return
  494. ;;;
  495.  
  496.